#ifndef GRAFO_H_
#define GRAFO_H_

#include "NodoGrafo.h"
#include <iostream>
#include <vector>
#include <stack>

class Grafo {

public:
	Grafo(unsigned cantidadDeVertices, unsigned cantidaDeAristas);
	virtual ~Grafo();

	bool esCiclico();
	void crearVertices();

	std::vector<NodoGrafo*> *getVertices() const;
	NodoGrafo* getNodoVertice(unsigned numeroDeVertice) const;

    void dirigirNodo(unsigned verticeOrigen, unsigned verticeDestino);
    void imprimir();
    bool etiquetar();

    std::vector<unsigned > *getEtiquetas() const;

    unsigned getEtiquetaVertice (unsigned numeroVertice);
    void setEtiquetasParaVertice(unsigned vertice, unsigned valor);

    void imprimirFuncionG();

private:
    std::vector <unsigned> *etiquetas;
    std::vector <NodoGrafo*> *vertices;
    std::vector <NodoGrafo*> nodosVisitados;

    unsigned cantidadDeVerticesEtiquetados;
    unsigned cantidadDeVertices;
	unsigned cantidadDeAristas;
	unsigned etiquetaActual;

	bool elGrafoEsCiclico;

	void resetNodosVisitados();
	bool visitar(NodoGrafo* nodoActual);
	void etiquetarUnCamino(std::vector <NodoGrafo*> *verticesAEtiquetar);

	bool quedanVerticesSinEtiquetar();
	bool quedanAdyacenciasSinRecorrer(NodoGrafo* nodoActual);

	void etiquetarPar(NodoGrafo* nodoUno, NodoGrafo* nodoDos );
	void agregarNodosConAdyacenciasSinEtiquetar(std::vector<NodoGrafo*> * verticesAEtiquetar, std::vector<NodoGrafo*> * verticesPendientes);
	NodoGrafo* siguienteNodoConAdyacenciasSinEtiquetar(std::vector<NodoGrafo*> * verticesAEtiquetar);
};

#endif /* GRAFO_H_ */
